package com.example.threadcode.basicLeverTwo.ThreadStopping.v2;

/**
 * 这里加了synchronized关键字,使得只有主线程内存的副本被访问.来使得线程安全.
 *
 * 这是不好的设计.有两个原因:
 * 1. 你只需要解决可见性的问题,synchronized关键字还能解决互斥性问题
 * 2. 更重要的是你使用synchronized会带入一系列问题到该应用中
 * 因为synchronized(this)使用的是当前StoppableThread实例对象锁
 * 那么执行这个循环就需要持有这个对象锁,那么一直在run方法中循环,锁就没法释放,那么任何企图通过默认主线程使用这个对象去调用
 *  thd.stopThread() 这个方法时候将会导致默认主线程被阻塞因为默认主线程得不到StoppableThread实例对象锁
 */
public class ThreadStopping
{
   public static void main(String[] args)
   {
      class StoppableThread extends Thread
      {
         private boolean stopped; // defaults to false

         @Override
         public void run()
         {
            synchronized(this)
            {
               while(!stopped)
                 System.out.println("running");
            }
         }

         synchronized void stopThread()
         {
            stopped = true;
         }
      }
      StoppableThread thd = new StoppableThread();
      thd.start();
      try
      {
         Thread.sleep(1000); // sleep for 1 second
      }
      catch (InterruptedException ie)
      {
      }
      thd.stopThread();
   }
}